В этом шаге мы возьмем предыдущий пример и сделаем пару изменений.
Во-первых сделаем еще один пункт в меню View, назовем его скажем Projection. Добавим еще переменную, например BOOL m_bProj.
Сделаем обработчик нового пункта меню:
void CExampleView::OnViewProjection()
{
// TODO: Add your command handler code here
if(m_bProj)
m_bProj = FALSE;
else
m_bProj = TRUE;
InvalidateRect(NULL, FALSE);
}
И допишем несколько строк в OnDraw(...):
void CExampleView::OnDraw(CDC* pDC)
{
CRect clientRect;
CExampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
GetClientRect(&clientRect);
glViewport(0, 0, clientRect.right, clientRect.bottom);
glClearColor (0.5, 0.5, 0.75, 1.0);
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 0.0, 0.5);
glLoadIdentity();
if(m_bProj)
glFrustum (-1, 1, -1, 1, 3, 10);
else
glOrtho(-2, 2, -2, 2, 0, 15);
glTranslatef(0.0, 0.0, -8.0);
glRotatef(30.0, 1.0, 0.0, 0.0);
glRotatef(70.0, 0.0, 1.0, 0.0);
switch(m_iMode)
{
case 0:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
break;
case 1:
glEnable(GL_POINT_SMOOTH);
glPointSize(10);
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
break;
case 2:
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
break;
}
DrawCube();
SwapBuffers(pDC->m_hDC);
}
В зависимости от состояния флага m_bProj мы устанавливаем либо перспективную либо ортогональную проекцию модели. Попереключайте флаг, посмотрите отличия.